//
//  NELoginEngine.h
//  LoginSDK
//
//  Created by Axis on 14-9-28.
//  Copyright (c) 2014年 netease. All rights reserved.
//

//#import "NELoginPlatformAvaliable.h"    //for check the platform of apple

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import <NELoginSDK/NELoginDataDefine.h>

/*UI调用此类*/
#define LoginEngine ([NELoginEngine sharedInstance])

@interface NELoginEngine : NSObject
+ (id)sharedInstance;

@property (nonatomic, assign) BOOL debugMode; // DebugMode，default value is NO

/*!@brief 初始化
 * @param aProductId，产品id，由urs分配
 * @param aPublicKey，urs公钥，由urs分配的公钥字符串
 * @param aP12KeyPassword，产品p12格式私钥密码，由urs分配的.pem格式私钥转换后的.p12格式私钥密码
 */
- (void)initWithProductId:(NSString *)aProductId
             ursPublicKey:(NSString *)aPublicKey
  productPrivateKeyP12Psd:(NSString *)aP12KeyPassword;

/*!@brief version number of SDK
 */
- (NSString *)loginSDKVersion;

/**
 *  小版本号
 *
 *  @return 小版本号
 */
- (NSString *)loginSDKInternalVersion;

/**
 *  关闭日志系统（不存储也不上传）
 *  关于日志系统：
 *  SDK 会本地进行日志存储、定时上传至 URS 服务器。以此来获取一些用户操作的信息，及时捕获问题，以便日后排查；需要耗费一定流量。
 *  日志级别从高到低为：error、info、debug。如果开启 info 级别，error 信息也会保存并上传；如果开启 debug 级别，error 信息和 info 信息也会保存并上传。
 *
 *  默认为 error 级别。
 
 *  如果不希望 SDK 保存用户信息，使用 forbidLog 禁用日志系统
 */
- (void)forbidLog;

/**
 *  开启 error 级别日志。
 */
- (void)startErrorLog;

/**
 *  开启 info 级别日志
 */
- (void)startInfoLog;

/**
 *  开启 debug 级别日志
 */
- (void)startDebugLog;

/*!@brief product id
 */
- (NSString *)loginProductId;

/*!@brief 初始化返回的id
 */
- (NSString *)loginInitId;

/*!@brief 初始化返回的key
 */
- (NSString *)loginKey;

#pragma mark - 兼容

//- (void)setWithProductId:(NSString *)aProductId
//            ursPublicKey:(NSString *)aPublicKey
// productPrivateKeyP12Psd:(NSString *)aP12KeyPassword;

/*!@brief 老的登录逻辑接入SDK后，更新当前的登录状态。用于旧登录接口与新登录接口的兼容，将旧登录接口的参数更新为新接口的参数，更新完后共享登录可以使用。
 * @param aInitId，初始化id，必传。更新成功后通过- (NSString *)loginInitId接口获取新的id.
 * @param aKey，初始化key，必传。更新成功后通过- (NSString *)loginKey接口获取新的key.
 * @param aToken，非必传，登录token。
 */
- (void)updateLoginStateWithId:(NSString *)aInitId
                           key:(NSString *)aKey
                         token:(NSString *)aToken
               completionBlock:(NELoginCompletionBlock)aCompletionBlock;

#pragma mark - URS登录

/*!@brief URS登陆
 *
 * 登陆成功后，产品可以根据currentToken方法获取当前登陆token与产品服务器做进一步登陆相关操作，如根据token获取用户账号相关信息。
 * @param aType，登陆类型，当前支持登陆类型：LoginTypeURS
 * @param aUsername，用户名
 * @param aPassword，密码
 */
- (void)loginWithType:(LoginType)aType
             username:(NSString *)aUsername
             password:(NSString *)aPassword
             isMD5   :(BOOL)isMD5
      completionBlock:(NELoginCompletionBlock)aCompletionBlock;

#pragma mark - 共享登陆统一UI接口

/*!@brief 共享登陆统一UI接口
 *
 * @param aContext，上下文环境
 * @param aCompletionBlock，共享登陆完成回调
 */
- (void)showShareViewControllerInContext:(UIViewController *)aContext
                         completionBlock:(NELoginCompletionBlock)aCompletionBlock;

#pragma mark - 共享登录

/*!@brief 请求当前device上已经登录成功的app ticket列表
 *
 * 同一个产品下只取最近一次登录的用户
 */
- (void)requestTicketListWithCompletionBlock:(NELoginTicketCompletionBlock)completionBlock
                                failureBlock:(NELoginFailureBlock)failureBlock;


/*!@brief 共享登陆
 * @param aType，登陆类型，当前支持登陆类型：LoginTypeShare
 * @param aTicket，已经登录app ticket，由requestTicketListWithCompletionBlock接口请求返回
 */
- (void)loginWithType:(LoginType)aType
               ticket:(NSString *)aTicket
      completionBlock:(NELoginCompletionBlock)aCompletionBlock;

#pragma mark - 手机号登录相关
/**
 *  通过手机号，获取验证码。调用此方法，则会收到一条短信验证码
 *
 *  @param phoneNumber      手机号
 *  @param aCompletionBlock 回调
 */
- (void)verificationCodeWithPhoneNumber:(NSString *)phoneNumber
                                referer:(NSString *)referer
                        completionBlock:(NELoginCompletionBlock)completionBlock;

/**
 *  通过手机号以及收到的验证码登录
 *
 *  @param phoneNumber      手机号
 *  @param verificationCode 验证码
 *  @param completionBlock  回调
 */
- (void)loginWithPhoneNumber:(NSString *)phoneNumber
            verificationCode:(NSString *)verificationCode
              loginException:(NSString *)loginException
                needLeakInfo:(BOOL)needLeakInfo
             completionBlock:(NELoginCompletionBlock)completionBlock;

/**
 *  通过手机号和密码登录
 *
 *  @param phoneNumber 手机号
 *  @param password    密码
 */
- (void)loginWithPhoneNumber:(NSString *)phoneNumber
                    password:(NSString *)password
               isMD5Password:(BOOL)isMD5
              loginException:(NSString *)loginException
                needLeakInfo:(BOOL)needLeakInfo
                     referer:(NSString *)referer
             completionBlock:(NELoginCompletionBlock)completionBlock;

#pragma mark - 退出登录

/*!@brief 退出登陆
 *
 * 退出登陆成功后，产品可以与产品服务器做进一步退出登录相关操作。
 */
- (void)logoutWithCompletionBlock:(NELoginCompletionBlock)aCompletionBlock;

#pragma mark - 验证token

/*!@brief 验证当前登录token是否有效
 */
- (void)verifyTokenWithCompletionBlock:(NELoginVerifyTokenBlock)completionBlock
                          failureBlock:(NELoginFailureBlock)failureBlock;

#pragma mark - 取消当前请求

/*!@brief 取消当前登陆，退出登陆，验证token等请求
 */
- (void)reset;

#pragma mark - 登录成功后相关信息接口

/*!@brief 当前是否登陆
 */
- (BOOL)isLogined;

/*!@brief:当前登陆类型
 */
- (LoginType)currentLoginType;

/*!@brief:当前登陆账户,即用户输入的账户。
 * 注意：
   1.URS登陆账号为用户输入，主账号未urs服务器返回
   2.共享登陆返回的登陆账户和主账户一样
 */
- (NSString *)currentLoginAccount;

/*!@brief:当前登陆主账号,urs返回的主账号
 */
- (NSString *)currentLoginMainAccount;

/*!@brief:当前登陆token
 */
- (NSString *)currentToken;

/*!@brief:uniqueId
 */
- (NSString *)uniqueId;

/*!@brief:keyChain group Id
 */
- (NSString *)uniqueIDCf;

#pragma mark - 手机号登录相关信息
/*!@brief: 返回异常状态信息
 */
- (NSString *)loginException;

/*!@brief: 返回账号是否泄露
 */
- (BOOL)leak;

/*!@brief: 返回上次登录时间
 */
- (NSString *)verifyTime;

/*!@brief: 返回是否有密保邮箱
 */
- (BOOL)securityEmail;

/*!@brief: 返回是否设置过密码
 */
- (BOOL)hasPassword;
@end